起因
- 其实也没啥起因,只不过是觉得自己没学好计算机网络,八周的课时,老师自己都不知道自己讲的是啥;我么买了本计算机网络 自顶向下方法,觉得计算机网络还真的是蛮有意思的;而且很多东西,我都自己实验了蛮有趣的;远不是想象的那么枯燥;
应用层
- 两大体系结构:
- cs
- p2p
- 那什么B/S其实只是一种C/S结构罢了;
- TCP服务
- 面向连接的服务,全双工通信,结束时必须拆除
- 可靠的数据传输服务
- UDP服务
- 只提供最小服务,就是把数据发出去,到不到不管;
- when in doubt, use TCP.
- 虽然UDP看起来没什么用处,但是在对时效性有关的程序还是可以使用的,但是如今的宽带足够,UDP的作用就不那么明显了;但是UDP也给了自由,可以在UDP基础上,进行改写
- 运输层提供服务
- 非持续连接和持续连接
- HTTP是基于TCP的,也就是面向连接的,最初的协议是每个请求/响应 经一个TCP连接传输,然后就关闭;在当今这种一个web页面,成百上千个资源下肯定不行,所以就修改为持续连接;这样打击都通过一个TCP连接,就不会有等待TCP建立连接的尴尬了;
- TCP是全双工的,也就是请求和响应是可以同时进行的,我的猜测
- cookie
- HTTP是无状态的,所以想知道谁是谁,就需要在本地记录cookie;就好像银行接待人员永远都不关心你是谁,拿着银行发的卡,银行就知道你是谁了;
WEB缓存
- 其实这个名字听起来比较陌生,代理就简单多了;
- 正向代理,就是针对客户端而言的,我现在使用的shadowsocks,就可以认为是,我的服务器对我的pc进行了代理,我想要访问境外网站,就可以让我的服务器去建立连接,然后将请求返回到我自己的pc上,只不过应该就没使用缓存功能吧,这个不清楚了;
- CDN,说起缓存,其实CDN是很典型的例子,在我就近的网络中,有一个结点缓存了很多我需要的资源,比如很多css文件,由于web的页面打开速度很大取决于页面渲染部分,所以CDN的存在就异常重要;
- 反向代理,针对服务器的,比如我们访问Google,Google肯定有一大堆的服务器,然而面对我们的可能就那么一两个,你要是请求什么,代理就去找什么;这样的好处也就在于,可以隐藏原服务器;
- WEB缓存中的东西很可能过期,这是就可以问一下原服务器,通过GET方法
FTP
- FTP其实还蛮简单的,重点就是他有两个端口,20,21;而且很显然,这是面向连接的,就是使用TCP的
- 简单邮件传输协议,一个推协议,从发送端一直推到接收端
- 用户代理或者干脆就命令行要与自己的邮件服务器进行通信,验证后,发出邮件,邮件先加入邮件服务器的发送队列,然后发到目的用户的邮件服务器;但是假设目的用户不在线,那么邮件服务器就没办法喽;
POP3
- 邮件访问协议,与邮件服务器端口110建立连接后,验证,然后就可以收取邮件,可以不删除邮件服务器的备份,也可以删除掉;
IMAP
- 一个复杂的邮件访问协议,可以关联文件夹啥的;
邮件吐槽
- 今天我们使用最多的其实时浏览器上的邮箱,什么163,qq啊,所以上面三种协议离得真的好远,不过所幸我在腾讯云服务器搭了邮件服务器,稍微加深了一些印象;
- 邮件绝对不是你发了,对面立马就收到了,在foxmail客户端上,就有收信的操作,然后你就感觉到POP3在干活了;
DNS
- 提供域名转换服务,主机别名,邮件别名
- 提供负载分配,但是没法检测云主机的状态
- DNS请求流程,
- 将请求发给本地dns,之后本地dns就代替了我们,这时可认为是递归查询
- 本地dns请求根dns服务器,根dns响应
- 本地dns再请求dns服务器响应的服务器
- 如此迭代查询
- DNS 缓存
- 很明显的,每次都请求那么多DNS服务器不明智,所以DNS本地会进行缓存
P2P
- 区别与C/S的结构
- C/S结构,有明确的服务器,所有资源都需要服务器来承担,当用户量大的时候,服务器宽带就称为限制;
- P2P结构允许客户端之间互相传输,分发时间的增长就非常缓慢
- 但是P2P也是有服务器的,只不过服务器会保存洪流表,就是告诉我们应该和谁进行连接;
UDP和TCP 的套接字编程
- UDP12345678910111213from socket import *# 主机ip,还有端口serverName = '127.0.0.1'serverPort = 12000#建立一个socket,SOCK_DGRAM表明是UDPclientSocket = socket(AF_INET,SOCK_DGRAM)while True:message = input('input lowercase sentence: ')#发送时,要携带主机地址和端口,每次都是clientSocket.sendto(message.encode(),(serverName,serverPort))modifiedMessage , serverAddress = clientSocket.recvfrom(2048)print(modifiedMessage)clientSocket.close()
|
|
- TCP1234567891011121314from socket import *# ip,端口serverName= '127.0.0.1'serverPort = 12000#SOCK_STREAM表明这是一个TCP连接clientSocket = socket(AF_INET,SOCK_STREAM)#进行连接clientSocket.connect((serverName,serverPort))sentence = input('input lowercase sentence')#发送,注意已经有了连接,所以不需要指明去哪里clientSocket.send(sentence.encode())modifiedSentence = clientSocket.recv(2048)print('from server',modifiedSentence)clientSocket.close()
|
|